package com.cencat.common.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;

/**
 * ID生成器工具类
 * 提供多种ID生成策略
 * 
 * @author cencat
 * @since 2024
 */
public class IdGenerator {
    
    private static final AtomicLong SEQUENCE = new AtomicLong(1000);
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    
    /**
     * 生成UUID（去除横线）
     * 
     * @return 32位UUID字符串
     */
    public static String generateUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }
    
    /**
     * 生成带横线的UUID
     * 
     * @return 36位UUID字符串
     */
    public static String generateUUIDWithHyphen() {
        return UUID.randomUUID().toString();
    }
    
    /**
     * 生成基于时间戳的ID
     * 格式：yyyyMMddHHmmss + 4位序列号
     * 
     * @return 18位时间戳ID
     */
    public static String generateTimestampId() {
        String timestamp = LocalDateTime.now().format(DATE_FORMAT);
        long sequence = SEQUENCE.getAndIncrement();
        if (sequence > 9999) {
            SEQUENCE.set(1000);
            sequence = SEQUENCE.getAndIncrement();
        }
        return timestamp + String.format("%04d", sequence);
    }
    
    /**
     * 生成订单编号
     * 格式：ORDER + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 订单编号
     */
    public static String generateOrderCode() {
        return "ORDER" + generateTimestampId();
    }
    
    /**
     * 生成用户编号
     * 格式：USER + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 用户编号
     */
    public static String generateUserCode() {
        return "USER" + generateTimestampId();
    }
    
    /**
     * 生成商家编号
     * 格式：MERCHANT + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 商家编号
     */
    public static String generateMerchantCode() {
        return "MERCHANT" + generateTimestampId();
    }
    
    /**
     * 生成司机编号
     * 格式：DRIVER + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 司机编号
     */
    public static String generateDriverCode() {
        return "DRIVER" + generateTimestampId();
    }
    
    /**
     * 生成派单编号
     * 格式：DISPATCH + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 派单编号
     */
    public static String generateDispatchCode() {
        return "DISPATCH" + generateTimestampId();
    }
    
    /**
     * 生成产品编号
     * 格式：PRODUCT + yyyyMMddHHmmss + 4位序列号
     * 
     * @return 产品编号
     */
    public static String generateProductCode() {
        return "PRODUCT" + generateTimestampId();
    }
    
    /**
     * 生成自定义前缀的编号
     * 格式：prefix + yyyyMMddHHmmss + 4位序列号
     * 
     * @param prefix 前缀
     * @return 自定义编号
     */
    public static String generateCustomCode(String prefix) {
        return prefix + generateTimestampId();
    }
    
    /**
     * 生成纯数字ID（基于时间戳和序列号）
     * 
     * @return 长整型ID
     */
    public static Long generateNumericId() {
        return System.currentTimeMillis() * 10000 + SEQUENCE.getAndIncrement() % 10000;
    }
    
    /**
     * 重置序列号（用于测试或特殊场景）
     */
    public static void resetSequence() {
        SEQUENCE.set(1000);
    }
}